// SKNotes - a note taking and gathering tool
// Copyright (C) 2009  Stefan Kueng
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

namespace SKNotes.Configuration
{
    using System;
    using System.Collections;

	public sealed class SettingCollectorCollection : IEnumerable
	{
		public event SettingCollectorCancelEventHandler CollectingSetting;

		public SettingCollectorCollection( ApplicationSettings applicationSettings )
		{
			if ( applicationSettings == null )
			{
				throw new ArgumentNullException( "applicationSettings" );
			}

			this.applicationSettings = applicationSettings;
		}

		public ApplicationSettings ApplicationSettings
		{
			get { return this.applicationSettings; }
		} 

		public int Count
		{
			get { return this.settingCollectors.Count; }
		} 

		public IEnumerator GetEnumerator()
		{
			return this.settingCollectors.GetEnumerator();
		} 

		public void Add( ISettingCollector setting )
		{
			if ( setting == null )
			{
				throw new ArgumentNullException( "setting" );
			}
			setting.ApplicationSettings = this.applicationSettings;
			setting.CollectingSetting += new SettingCollectorCancelEventHandler( SettingCollectingSetting );
			this.settingCollectors.Add( setting );
		}

		public void Remove( ISettingCollector setting )
		{
			if ( setting == null )
			{
				throw new ArgumentNullException( "setting" );
			}
			setting.CollectingSetting -= new SettingCollectorCancelEventHandler( SettingCollectingSetting );
			this.settingCollectors.Remove( setting );
		}

		public void Clear()
		{
			foreach ( ISettingCollector settingCollector in this.settingCollectors )
			{
				Remove( settingCollector );
			}
		}

		public void Collect()
		{
			foreach ( ISettingCollector settingCollector in this.settingCollectors )
			{
				settingCollector.Collect();
			}
		} 

		private void SettingCollectingSetting( object sender, SettingCollectorCancelEventArgs e )
		{
			if ( CollectingSetting != null )
			{
				CollectingSetting( this, e );
			}
		}

		private readonly ArrayList settingCollectors = new ArrayList();
		private readonly ApplicationSettings applicationSettings;
	}
}
